これは現在 作り途中の JavaScript です。最終的には 3D 表示で制御する予定です。(もう一度)
プログラミングやRPG(作るほう)が好きな人の日記
このウェブページは毎日 夜11時にアクセスできなくなります。 朝6時半に再開されます。(世の中のネット依存対策として) 例外でアクセスができる場合があります。上のメニューの「aboutThisWebsite」を参照してください。 URL は https でもアクセスできます。 黒猫画像はクリック(タッチ)すると消えます。 NO PC WEEK とは私自身の健康のために私のパソコンの使用を制限する期間です。 【【 私自身へ、記事の先頭に5W1H を書くといいかも 】】 |
No. | A1. 1問 |
A2. 運動 | B. PC使用 開始時刻 |
C. 予定使用時間 時間:分 (当日限度時間 時間:分) |
D. 予定終了時刻 |
E. 実際終了時刻 |
F. 実際使用時間 時間:分 (当日限度時間 時間:分) オーバー理由 |
G. 判定 |
H. 作業内容 |
---|---|---|---|---|---|---|---|---|---|
269 | 休止 | ◎ | 21:11 | 1:30(1:30) | 22:41 | 23:00 | 1:49(1:30) | ○ | 10月扉スクリプト |
記録しなかった長時間作業あり 作業内容:記事作成 | |||||||||
268 | ◎ | ◎ | 11:10 | 1:00(2:00) | 12:10 | 12:15 | 1:05(2:00) | ◎ | 10月扉スクリプト |
267 | ◎ | ◎ | 23:10 | 2:00(4:00) | 1:10 | 1:31 | 2:21(4:00) | △ | 10月扉スクリプト |
266 | ◎ | ◎ | 19:35 | 2:00(4:00) | 21:35 | 21:47 | 2:12(4:00) | ○ | 10月扉スクリプト |
265 | ◎ | ◎ | 13:45 | 2:00(2:00) | 15:45 | 16:08 | 2:23(2:00) | △ | 10月扉スクリプト |
264 | ◎ | ◎ | 22:00 | 2:00(2:00) | 0:00 | 0:03 | 2:03(2:00) | ◎ | RPG試作 |
263 | ◎ | ◎ | 17:00 | 2:00(2:00) | 19:00 | 24:00 | 5:00(2:00) PCは使わず(午前中から)紙上で計算してた |
◎ | 10月扉スクリプト |
262 | ◎ | ◎ | 20:10 | 1:30(1:30) | 21:40 | 21:57 | 1:47(1:30) | ○ | 10月扉スクリプト |
261 | ◎ | ◎ | 19:45 | 1:30(1:30) | 21:15 | 21:39 | 1:54(1:30) | △ | 10月扉スクリプト |
260 | ◎ | ◎ | 23:00 | 1:00(1:00) | 24:00 | 24:12 | 1:12(1:00) | ○ | 3Dモデル「グリフォン」 |
記録しなかった長時間作業あり 作業内容:記事作成 | |||||||||
259 | ◎ | ◎ | 23:40 | 1:00(3:00) | 24:40 | 2:30 | 2:50(3:00) 計算方法に悩んでいた |
× | 10月扉スクリプト |
258 | ◎ | ◎ | 20:57 | 1:00(3:00) | 21:57 | 22:03 | 1:06(3:00) | ◎ | 10月扉スクリプト |
257 | ◎ | ◎ | 19:00 | 1:00(3:00) | 20:00 | 20:08 | 1:08(3:00) | ◎ | 10月扉スクリプト |
記録しなかった長時間作業あり 作業内容:この絵をつくっていた → | |||||||||
記録しなかった長時間作業あり 作業内容:その他のプログラミング | |||||||||
256 | ◎ | ◎ | 0:21 | 2:00(3:00) | 2:21 | 2:41 | 2:20(3:00) | △ | 10月扉スクリプト |
255 | ◎ | ◎ | 19:50 | 1:00(3:00) | 20:50 | 21:01 | 1:11(3:00) | ○ | 10月扉スクリプト |
254 | ◎ | ◎ | 18:55 | 1:30(1:30) | 20:25 | 20:45 | 1:50(1:30) | △ | 10月扉スクリプト |
この表の意図:
多くの人はパソコンのやりすぎやネットゲームのやりすぎには困っていると思います。
参考に言うと、この表を使う前の私は 1 回の PC 使用時間がノンストップで 17 時間というときもあったし、平均で言うと毎日 9 時間はやっていたと思います。
そういう徹夜とか長時間作業をするよりも、昼間の短時間作業のほうが生産性は高いのでは? と数年前から考えてきました。
パソコンの使用時間を事前に決めて、ネット上に公開することで、パソコンのやりすぎを防止できるかどうかこの表を使って試しています。
記入の法則:
例外事項:
廃止事項:
以下の事項は実施できないので廃止する。
中途結果:
結構いい結果になっています。炊事や掃除、散歩、早起きなどが好ましいリズムでできるようになりました。
(2020年9月6日追記:散歩、早起きは最近あまりできていません。掃除や炊事は理想的にできています)
また、パソコン以外の趣味も進むようになりました。電子回路、ガンプラ、RPG のプログラム以外のモンスターイラストやストーリーなど RPG の肉付け部分の創作、勉強、昔好きだったペーパークラフト等々。
そしてパソコンの趣味自体も深夜遅くまで行うよりも質が高くなったように感じます。制限された短い時間の中で結果を得ようとするので、取捨選択が行われているし、時間が終了して、空いた時間ができ、それがほどよい休憩になり、今後の作業の方針を落ち着いて検討することもできます。それが質につながっているのかなと思います。
この取り組みが、15 才 ~ 18 才くらいまでの高専(中退)に所属していた時に実施できていたら良かっただろうなと思います。でもそれくらいの年齢では経験が浅く、このような効果的なルール作りを行うことはできなかったと思います。自分は人に比べて「創作意欲」や「ゲームで遊ぶ欲望」におぼれやすいところがあり、そのコントロールはとても難しいです。
ちなみに、分単位で記録を取ったりして、だいぶマメに見えるかもしれませんが、Windows の日本語入力(MS-IME)で「いま」と入力し、 変換 キーを押さずに ↑ ボタンを押すと現在の時刻になります。道具の便利さが人をマメに見せるのかもしれません。
自分の家族にすすめたい:
パソコンのやりすぎやネットゲームのやりすぎは社会問題にもなっているので、そう思うご家族の方は多くいらっしゃると思います。私の両親も過去に私について問題にしていました。
この表はその家族が困っていたときから 30 年後に、私が自分で必要を感じて作ったものです。
私は今 一人暮らしをしていて、自分で生計を立てる中、パソコンにおぼれた生活をすると、生活がうまく回らなくなるんです。具体的には、
このような必要にせまられて自分の動機で始めた場合と、人からすすめられて始めた場合とでは、結果が異なると思います。
自分の切実な動機で始めたならうまくいくと思いますが、外から押し付けられたものはなかなか定着しないものです。
あまり適当なことは言えませんが、上記の青い部分で書いたことは、本人にとって得になることなので、「ときどき休憩して、他のあの趣味やってみたらどうだ?」とか「ときどき休憩したほうがプログラミングの質が上がるって話だぞ?」という形ですすめてみたらどうでしょうか。(それでも最終的には自立してもらうことは必要だと思いますが)
私が両親を困らせていたとき (A) に、突然、外へ一人で出て行って、一人暮らしを始めたり、接客業を始めたり、いくつか資格取得したりといろいろ行えた理由というのは、正直言ってわかりません。(※途中で失業して2度、実家に戻ったことがあります。1 回目は 21 才くらいのときに 5 年、2 回目は 35 才くらいのときに1年未満、実家にいて、何もしてなかったり働いたりしていました)
私が両親を困らせていたのは 16 才 ~ 20 才くらいのころ (上記A) ですが、そのころ家族と私自身と友人たちがみんなそれぞれ、私の生活について心配したり困ったり悩んだり、あの手この手を試したりしていました。そういう煮詰まったような状況が運命をそのように(解決の方向へ)動かすのかもしれません。運命がどうの というのは変ですが、そのくらいのことしか言えません。
この社会問題はクリアーすべきものみたいです。
↓臨時でここに置きます。
眠い時は寝る。
\ | 項目 | 26(土) | 27(日) | 28(月) | 29(火) | 30(水) | 31(木) | 1(金) | 2(土) | 3(日) | 4(月) |
---|---|---|---|---|---|---|---|---|---|---|---|
朝 |
散歩 |
◎ | ◎ | ◎ | … | ◎ | … | ||||
昼 |
掃除 10分 |
◎ | ◎ | … | … | … | … | ||||
電子機器組立て 1.5h |
開始18:07 予定19:37 終了19:55 合計1:48 回路図D |
開始16:35 予定18:05 終了23:00 合計6:25 比較回路 実験で敗北 |
… | … | 開始20:30 予定22:00 終了23:44 合計3:14 比較回路 基板図面 |
開始21:40 予定23:10 終了1:24 合計2:14 比較回路 基板完成 |
|||||
SQL 1.5h |
… | 開始12:15 予定13:45 終了13:54 合計1:39 P18-P60 of P292 |
開始18:10 予定19:40 終了3:55 合計9:45 Perl+Oracle で敗北した |
開始0:03 予定1:33 終了1:43 合計1:40 Perl+Oracle DBI版 |
… | 開始10:30 予定12:00 終了16:26 合計5:56 Perl+Oracle ODBC版 |
|||||
アセンブラ言語 1.5h (内訳:12個) |
開始11:12 予定12:42 終了12:53 合計1:41 準備完了 |
… | 開始15:30 予定17:00 終了17:10 合計1:40 P63 |
開始20:05 予定21:35 終了21:38 合計1:33 P65 |
… | … | |||||
平日PC(趣味) 1.5h |
(上の表 に記載) |
… | … | … | … | … | |||||
PCメンテナンス 0.5h |
… | … | … | … | … | … | |||||
23時 までに |
必ず風呂入る |
23:15 | 23:26 | … | … | … | … |
電子機器組み立て やろうと思っているから。(ただし行うのは回路実験)
SQL 応用情報を視野に入れていて必要だから。
アセンブラ言語 昔からのあこがれであって習得したいから。
平日PC 10月スクリプトほか
PCメンテナンス Windows への機能追加の時間がほしいといつも思っているから。
このカリキュラムが有効に機能することを願う。
長期の休みの際は、私は長い時間を利用して自己啓発のために計画を立てて勉強するようにしています。
今年の正月はコロナウイルスの関係で実家に帰らないことにしたので、自室にとどまり、この勉強をすることにしました。
それで12/26から計画を立てて始めたんですが、なんだかんだで時間を大幅にオーバーし、計画通りにいかない毎日が続いています。
(5W1Hを気にしなかったときは上の文章は無かったんですが、気にして文章を追加すると、下の挿絵も引き立ちますね!)
今日こそは、と思ったんですが、今日も1項目について6時間かけてしまいました。
ルールー
Oracle と Perl の通信ですが、前回は Perl の DBI という「データベースインターフェース」モジュールを使用してアクセスするのに てこずっていたんですが、今回は ODBC という方法でもアクセスできるようにしました。それが6時間もかかってしまいました。
きっかけは、DBI のほうで、SQL文「DESC fruit」と打ち込んだとき、エラーを出したことでした。
「DESC」命令は SQL の中でも Oracle が独自に拡張した命令だそうで、Perl の DBI では対応していないらしいんです。
SQL ってけっこういろいろな形で命令を実行することができるものなので、「一部対応していない」となると、勉強も制限される気がしたので、ODBC のほうはどうかなと思いました。
で、ODBC でなんとか Perl から SQL を打ち込めるようにしたんですが、DESC fruit と打ち込んでみると、結果が出ませんでした。
(fruit は本の例題のデータベースのテーブル名です。バナナとかリンゴとかのデータが登録されたデータテーブル)
エラーは出ないんですが、結果がからっぽなんです。
Oracle 製のソフトウェアである SQL*PLUS や SQL Developer で、DESC fruit と打ち込むとちゃんと結果が出るので、もしかしたら、Oracle が拡張したものは、Oracle のソフトでしか対応していないのかもしれません。
(あれ…それでいいのかな? Oracle は IT 業界でたくさん使われていて、その使われ方はもちろんそのソフトウェア会社が作成したソフトウェアから Oracle にアクセスするものであるはずで、そこでは ODBC や DBI が使われているはずで、それで一部の命令が使えませんって、、そんなことは無いはずですよね。ODBC と DBI 以外の方法だと対応できるとか??)
DBI や ODBC は Oracle だけではなく幅広くいろいろなデータベースに対応したインターフェースなので、拡張の命令には対応できない、ということなのかもしれません。
Perl でアクセスしようと頑張っていると、本で決められた内容だけを勉強するよりは、実戦的な力を磨いている…という気はしました。
ちなみに6時間もかかった原因は、「環境変数」でした。
Webブラウザ → Apache Web Server → Perl → ODBC → Oracle
という形で Oracle にアクセスしますが、どうしても Web ブラウザからのアクセス時にエラーが表示されます。
Oracle 特有の tnsnames.ora というファイルとか、データソースとか、DataSourceName 文字列に、接続識別子だとか、いろいろな要素がアクセス時にからんで、それらが正しく設定されて始めてアクセスできるというものなんです。
調べる場所がいろいろで何がいけないのやら…と調べまわって6時間。
Perl で環境変数 ORACLE_HOME や TNS_ADMIN を表示させてみると、あれっ、私が思っていたものと違う古い内容が入っていました。
それが原因で、ODBC が tnsnames.ora を見つけられずエラーになっていた…。ということでした。
でも私は Windows のシステムのほうで、新しい環境変数を正しく設定したはずなんです。
なんでやねん、と思って調べてみたら、どうやら Apache Web Server が問題だったようで(→そうではなく下記の追記参照)、Windows を再起動でもしない限り、古い内容をかたくなに保持し続けているようでした。Apache Web Server を再起動してもダメでした。まだ試していないんですが、Windows を再起動すれば新しい環境変数に更新してくれるはずです。
2021年1月2日追記:
Windows を再起動しても変わりませんでした。
Webサーバー(Apache や、たぶんその他の WEB サーバーも、)の「環境変数」は「OS の環境変数」とは少し違っていて、「OS の環境変数」を WEB 用に修正したものになっているんだそうです。
そのため、ORACLE_HOME や TNS_ADMIN といった OS の環境変数は WEB 用としては除外されていたようです。参照しても除外されていて存在しないので空の文字列になってしまいます。(下図上部)
なお、ODBC や DBI で接続の命令文を実行した時点で、(たぶん Oracle の dll のほうで?)環境変数を新たに設定するみたいです。(下図下部)
Perl で OS の環境変数を参照する:
ODBC の場合:
DBI の場合:
余談ですが、このとき、ODBC の場合は、ORACLE_HOME(例で言うと d:\apporacle_odbc\instant...)の中の、network\admin ディレクトリの tnsnames.ora を読みに行きます。そのディレクトリがない場合は、自分で手動で network\admin ディレクトリを作成し tnsnames.ora テキストファイルを作成すれば読んでくれます。(テキストファイルの内容はここでは説明しません)
また、ORACLE_HOME 直下の tnsnames.ora は読まないみたいです。
(下記の方法で環境変数の ORACLE_HOME を参照できた場合は、直下の tnsnames.ora を読むのに)
DBI の場合は後述しますが、そもそも tnsnames.ora は不要です。
以上余談でした。
Apache Web Server で、OS の環境変数を意図的に引き継ぎたい場合は、Apache Web Server の設定ファイルである httpd.conf の中で、下図のように設定します。
「passenv 環境変数名」を httpd.conf の空いている場所に記述すれば、その環境変数が perl などのスクリプトで参照できるようになります。
(すべての環境変数を一気に引き継がせる方法はわかりません)
その結果、
ODBC の場合:
DBI の場合:
このように、OS の環境変数が Perl スクリプトの中に入ってきます。
そして、ODBC にしろ DBI にしろ、Oracle の dll は、「環境変数が設定されているので新たに環境変数の設定を行わない」という動きになっているようで、上手の "実行後" も同じ環境変数のままになっています。
ちなみに、このとき ORACLE_HOME をシステムのほうで別の内容に手動で変更した場合、その反映は Windows の再起動後みたいです。Apache を再起動しても反映されませんでした。(私の環境の Apache は exe ではなく Windows のサービスとして動いていて、それを停止しても開始しても環境変数などの情報は更新されないみたいです。してくれればいいのに)
「Web サーバーというものは OS の環境変数をそのまま引き継いだりしない」ということに最初から気づいていれば、こんなに悩まなくて済んだ、ということですね。
***
ところで、その後に追加で調べましたが、ODBC と DBI はそれぞれ tnsnames.ora を参照 する/しない が異なるようです。
tnsnames.ora は環境変数の ORACLE_HOME または TNS_ADMIN に指定されたディレクトリまたは、その下の network\admin ディレクトリに置きます。(私の環境ではそのどちらに置いても動作しました)
試しに tnsnames.ora のファイル名を tnsnames_.ora に変えて読めないようにし、ODBC と DBI のそれぞれの Perl スクリプトの結果を見ると、
ODBC の場合: 動作しない (エラーは、ORA-12154: TNS: 指定された接続識別子を解決できませんでした)
DBI の場合: 動作する
という結果になりました。
つまり、ODBC は tnsnames.ora ファイルが必要ですが、DBI は必要ないみたいです。
それもそのはずで、DBI のほうでは接続時に、
DBI -> connect( "dbi:Oracle:host=asuspc;service_name=orcl;port=1521;", "system", "**パスワード**" )
このような文字列を使って接続しており、これは tnsnames.ora の内容と同一なんです。
また時間取られたな…
コンピューターで何かをやろうというとき、こういうハマリは付き物で、どうしても避けられないものなんでしょうかね。
やりたいことを実現するためには、お正月の自己啓発のカリキュラムで 1.5h という時間制限を設けても、そんな短い時間では問題の解決は望めないと…。
難しいッスね!
|
(訪問者のどんなニーズと この記事がつながるか)
私が以前に作った3D迷路のプログラムについて、あらためてリリースすることを最近考えています。
しかしそのままだとただ迷路を進むだけの状態なので面白くないと思います。
それはちょっと動かしてみればわかります。↓
▼以前私が作った3D迷路プログラム(クリックすると起動します。ただしゲームにはなっていません)
(もっと奥まで表示させたいときは画面を表示した状態で U ボタンを押します。左端のキー説明を参考に)
( U を5回、R を10回、E を35回、S をたくさん押すと、 こういうブランディッシュ(リンクは Bing で画像検索)みたいな画面になります)
そういうときゲーム性として私が考えるキーワードはまず最初に「維持」です。
前にも同じ話をしたことがありますが、球技とかで接戦すると たとえ負けても「いい試合だった」と喜び合えます。
それはお互いに自分たちの状態を、相手に押されないように「維持」するのであって、互いに自分たちを維持しようとするからこそ接戦になるのだと思います。最近のゲームソフトでは、Aボタンの連打だけで敵との戦いが終わってしまうというものが多くて、そういうゲームはつまらないですよね。限られた選択肢のなかで自分を維持するために戦略を練るんです。
1つの例としてトランプのババ抜きについて考えて見ると、ババ抜きに見られる「維持」ってなんでしょうね。
と、「維持」するわけです。それがくつがえされると、「さぁ困った!」となります。
ババを早く相手に引かせるなり、自分がカードをもっと捨てられるようにするなり、手を打たなければなりません。
そのための手段として、
単純なゲームなのに、かけひきがあって、楽しいですよね。
▼ババ抜きで、こんなに出っ張ったカード。そのカードを取る?それ以外を取る?
ハイ!どーぞ!面白い RPG を開発するための謎の言葉、INTKSBFS には登録していませんが、このかけひき「のるか、そるか」も面白いゲームのためには大事ですね。
面白い RPG を開発するための INTKSBFS:
I | 維持 | …状態を維持することがゲーム性になる |
N | なんと!ネタ | …驚きが必要 |
T | 体験 | …幻想上の怪物と剣をふるって戦う疑似体験 |
K | こども | …ドラクエ1は小学生向けに作ったから成功した(と思う) |
S | しあわせ | …しあわせの描写が必要。 |
B | 冒険、危険 | …RPGは冒険譚 |
F | 二人プレイ | …みんなでわいわいしながらが良い |
S | サービス | …サービス精神 |
維持というからには、上の状態と中の状態と下の状態の区別があるわけですね。
なるべく下の状態にならないように、基本的に中の状態を維持し、ときどき上があれば良い。
迷路において、その上中下ってなんでしょう。
スーパーマリオって状態に上中下がありますね。
(グラディウスというシューティングゲームも、装備無しの状態は不利な感じで、ある程度装備を持った状態を中の状態として維持しないと、続かないゲームですね)
迷路と言ったら「宝箱」でしょう。宝箱はもちろん「上」の状態ですね。
そうだ、ドラクエ1の状態の上中下も考えてみましょう。
スーパーマリオもドラクエ1もそして、アニメのドラゴンボールも「敵」がいますね。いないとなりたちませんね。
では敵のいない「脱出ゲーム」の状態、上中下を考えてみましょう。「脱出ゲーム」は面白いものは面白いですよね。
というわけで、迷路には「敵」を登場させ「謎」や「宝箱」も配置し、エリア分けしてステージが進むようにすると良いのかな?
それって、当たり前じゃねぇかなぁ?
ボソッ |
当たり前のことを当たり前として実施することと、
筋道立てて考えて、その結果として(当たり前のことを)実施すること
は結構 白と黒ぐらいに違っています。
何かを教えるときに当たり前のことを表面的に教えればすぐに実行に移せて手っ取り早くて良いんですが、その結果、今の時代の若者が、教えられたとおりに行っているのに、「ちょっと違う」と外部からの批判にさらされてしまう…という事象がときどき見られます。
たとえば、
などなど、さまざまな分野でいっぱい見受けられます。
できれば、それを行う意味とか、理由とか、意義とか、そういう深いところを押さえたほうが、上記で箇条書きしたような空回り(表面的)にならずに済むと思うんです。教える側はその辺を事前に日ごろから考えなければならないということなので、教える立場って簡単じゃないですね。
人の感性っていうのは、表面的になってしまっている中にも、埋もれていたりするので、その辺を見つけてあげてほめてあげればその人は伸びると思います。直火焼きチャーハンの例で言うと、「やりたいことはわかる」と上司または消費者の人が言ってあげることです。それを笑うのは人としてあたりまえの反応かもしれませんが、理解は必要です。
ちょっと脱線しましたが、当たり前でやっていることの深いところって大事なんです。
(訪問者のどんなニーズと この記事がつながるか)
以前、電子機器組み立て1級/2級の「省エネコントローラー」という課題について、その回路図の一部を取り出して実験する…という記事を書いたことがありました。
その中で私のやっていることに一部 間違いがあったのでお知らせしておきます。
実験はコンパレーター IC の回路(電気信号を比較する回路)の動きを見ようというもので、私の実験では波形がうまく出ませんでした。
そこで電気の月刊誌「トランジスタ技術」を調べたところ、「コンパレーター IC の出力がオープンコレクタ(ドレイン)ではなく、TTL や CMOS ならば、その出力をAND や NANDでまとめてください」と書かれていて、私は何も確認しないで NAND で出力をまとめて、期待する波形が出たので喜んでいたんですが、今になって確認してみると、当該 IC の出力は「オープンコレクタ」でした。
月刊誌の通りにするなら、オープンコレクタの場合は NAND でまとめない、ということです。
どうして期待する波形になったんでしょうね。。
用語:
オープンコレクタ … 普通の出力がその IC が決めた電圧を出力するだけなのに対して、オープンコレクタやオープンドレインという仕様の出力は「ユーザーが決めた電圧の回路の、スイッチを入れるだけ」という動作になっているので、ユーザーが自由に電圧を決めることができる…というものです。(でいいかな?…自分はそう理解しています…)あとこの仕様の2つの出力を単純につなげるとOR論理演算になって便利なんだそうです。
TTL, CMOS … 信号の電圧の高さなどの仕様のこと。
AND, NAND … 2つの信号を論理的に計算するIC。
(※ここに、オープンコレクタの詳しい話を書いていましたが、イマイチだったので消しました)
(訪問者のどんなニーズと この記事がつながるか)
あー、あかんわ…
仕事が終わって、家で飲むビールがうまい……
眠い時は寝る。
\ | 項目 | 26(土) | 27(日) | 28(月) | 29(火) | 30(水) | 31(木) | 1(金) | 2(土) | 3(日) | 4(月) |
---|---|---|---|---|---|---|---|---|---|---|---|
朝 |
散歩 |
◎ | ◎ | ◎ | … | ||||||
昼 |
掃除 10分 |
◎ | ◎ | … | … | ||||||
電子機器組立て 1.5h |
開始18:07 予定19:37 終了19:55 合計1:48 回路図D |
開始16:35 予定18:05 終了23:00 合計6:25 比較回路で 敗北した… |
… | ||||||||
SQL 1.5h |
… | 開始12:15 予定13:45 終了13:54 合計1:39 P18-P60 of P292 |
開始18:10 予定19:40 終了3:55 合計9:45 Perl+Oracle で敗北した |
開始0:03 予定1:33 終了1:43 合計1:40 Perl+Oracle |
|||||||
アセンブラ言語 1.5h (内訳:12個) |
開始11:12 予定12:42 終了12:53 合計1:41 準備完了 |
… | 開始15:30 予定17:00 終了17:10 合計1:40 P63 |
開始20:05 予定21:35 終了21:38 合計1:33 P65 |
|||||||
平日PC(趣味) 1.5h |
(上の表 に記載) |
… | … | ||||||||
PCメンテナンス 0.5h |
… | … | … | ||||||||
23時 までに |
必ず風呂入る |
23:15 | 23:26 | … |
電子機器組み立て やろうと思っているから。(ただし行うのは回路実験)
SQL 応用情報を視野に入れていて必要だから。
アセンブラ言語 昔からのあこがれであって習得したいから。
平日PC 10月スクリプトほか
PCメンテナンス Windows への機能追加の時間がほしいといつも思っているから。
このカリキュラムが有効に機能することを願う。
中途経過ですが、思うようにいかず、1.5h(1時間半)どころか、6時間や9時間になってしまった日があります。
たとえば、28日(月)の「SQL」は、『Oracle が用意したクライアントソフト(SQL*PLUS や SQL Developer など)で勉強するよりは、自分がよく知っている Perl から Oracle に接続するようにすれば、自分の趣味と連動させて意欲的に学ぶことができる…その価値はとても大きい』と考えて「Perl から Oracle に接続する方法」をえんえんと調べて、9時間も経ってしまいました。時間的な計画としては敗北です。
しかし、Perl から Oracle へ自由に SQL でアクセスするようにできたので、良かったと言えば良かったです。
私が説明している環境では、Oracle が動いているパソコンと、そこへアクセスするパソコンは同じ LAN 上にある別々のパソコンとなっています。
下記はその成果物で、Perl から Oracle にアクセスするための注意点を書いています。行番号が邪魔な場合はこちら
20/12/29(火) 02:32:43
***
使用したOracle
Oracle Database 11g Enterprise Edition
Release 11.2.0.1.0 - 64bit Production
以降で言う instantclient-basic とは、Oracle データベースにアクセスするためのソフトウェアです。(コマンドラインで SQL を入力できる SQL*Plus や開発に必要な dll、ドライバなど)
Oracle が 11gR2 ならば、instantclient-basic も、同様のバージョンを用いること。
ただし、バージョンの後ろのほうは合ってなくても良い。
たとえば、
Oracle 11.2.0.1.0
client 11.2.0.4.0
11.2.0 くらいまであっていれば良い。
また、Perl が 32bit であるとき、instantclient-basic も 32bit でなければならない。
(64bitなら64bit。)
なぜなら、Perl は instantclient-basic に含まれる dll ファイルを直接読むから。(32bit のソフトと 64bit のソフトは互いに読み取れない)
なお、Oracle と instantclient-basic は 32bit で統一しなくても良い。
Oracle と instantclient-basic はネットワークを介してデータをやりとりするだけの関係だから。
https://qiita.com/towtow/items/a5c92482cca797456b86
このページに、exe ファイルが 32bit なのか 64bit なのか調べる方法が書かれている。
VisualStudio のランタイム(distributable)が必要。
(VisualStudio 本体ではない)
この方法で、インストールしてある perl.exe の bit を調べた。
また、タスクマネージャや、コントロールパネルの「プログラムと機能」でも bit 数が表示されている。
instantclient-basic-nt-11.2.0.4.0.zip に含まれている7つのファイル
oci.dll
ocijdbc11.dll
ociw32.dll
orannzsbb11.dll
oraocci11.dll
oraociei11.dll
orasql11.dll
を、Perl の bin フォルダへコピーすること。
(ここでは、instantclient-basic のインストールは不要で、7つのファイルだけがほしい)
コピーしておかないと、Perl が以下のようなエラーを出す。
Software error:
install_driver(Oracle) failed: Can't load 'C:/usr/lib/auto/DBD/oracle/oracle.dll' for module DBD::oracle: load_file:指定されたモジュールが見つかりません。
(このメッセージのその場所(パス)の oracle.dll ではなく、別の場所で別のdll(7つ)を追加するのが正解、というのがきびしい)
http://aibeeaqua.blog75.fc2.com/blog-entry-987.html
このページで7つのファイルのコピーの話がされている。
SQL の結果に日本語が含まれる場合文字化けする。
Oracle は UTF-8 で、Perl も UTF-8 で出力しているが、漢字が ??? といった文字になってしまう。
Oracle の文字コードを調べる SQL 文
SELECT VALUE FROM NLS_DATABASE_PARAMETERS WHERE PARAMETER='NLS_CHARACTERSET'
Perl スクリプトにてデータベースに接続する前に
環境変数 nls_lang=JAPANESE_JAPAN.AL32UTF8
を設定すれば文字化けしない。(Perl スクリプトが UTF-8 を使っている場合)
https://oshiete.goo.ne.jp/qa/2439209.html
この質問のベストアンサーに 環境変数 nls_lang を設定すると良い、とある。
https://www.Oracle.com/technetwork/jp/content/charcterset-250314-ja.pdf
この14ページと、18ページに JAPANESE_JAPAN.AL32UTF8 という文字列を作る手掛かりがある。
接続時の DSN 文字列(Data Source Name。データの取り込み対象(データベースなど)を特定する文字列)
この情報を参考にして、
$dsn = "dbi:mySQL:database=test;host=Localhost;port=3306";
https://qiita.com/uguis410/items/c276d27b7c2bab456b1fより
このようにした
$dbh = DBI -> connect( "dbi:Oracle:host=asuspc;service_name=orcl;port=1521;", "system", "**パスワード**" ) || die $DBI::errstr;
database の記述は必要ないようだ。
関係ないもの:
各環境変数は nls_lang 以外は関係ない。
ODBC 関係のセットアップは不要。
instantclient-basic のダウンロードページ:
「Instant Client Downloads for Microsoft Windows 32-bit」
https://www.oracle.com/database/technologies/instant-client/microsoft-windows-32-downloads.html
「Instant Client Downloads for Microsoft Windows (x64) 64-bit 」
https://www.oracle.com/database/technologies/instant-client/winx64-64-downloads.html
Perl サンプル:
以下のサンプルは WEB ブラウザ(正確にはブラウザからアクセスしたサーバー上の Perl スクリプト)から同一 LAN 上の Oracle にアクセスして、SQL を送信し、ある table のデータを得ている。
[test.cgi]
#!/usr/bin/perl
use CGI::Carp qw(fatalsToBrowser); #エラー内容をブラウザに表示する
use DBI;
local( $res );
#文字化けしないために必要
$ENV{ 'nls_lang' } = "JAPANESE_JAPAN.AL32UTF8";
$dbh = DBI -> connect( "dbi:Oracle:host=asuspc;service_name=orcl;port=1521;", "system", "**パスワード**" ) || die $DBI::errstr;
$sth = $dbh -> prepare( "select CODE, NAME, PRICE from fruit" ) or die $dbh -> errstr;
$sth -> execute() or die $sth -> errstr;
while ( my $str = $sth -> fetchrow_arrayref ) {
local( $code, $name, $price ) = @$str;
$res .= "$code, $name, $abc, $price<BR>";
}
$dbh->disconnect;
#---output.
#以下の<と>はすべて全角にしてあるので注意
print <<HERE;
content-type:text/html
<!DOCTYPE html>
<head>
<meta content="text/html; charset=UTF-8" http-equiv="content-type">
</head>
<body style="background-color : white;">
$res
</body>
</html>
HERE
exit;
このような価値さえ見込めれば、1.5hなどのルールをやぶってしまう…ということだと、計画は成功しません。
価値と時間のトレードオフ(片方を大きく取るともう片方は小さくなる)には悩まされます。。。
これくらいで満足して、
このあと思い付いた良い物(価値)は あきらめましょ! |
(訪問者のどんなニーズと この記事がつながるか)
これが10月スクリプトの一番最初の構想のメモです。
よく幸せの一場面としてドラマとかで描かれている、男の人が小さな女の子の手を取りぶんぶん回してあげてるあれです。
女の子が「キャハハハハー」なんて笑ったりして。
現在 2D の長方形をつなげてアニメーションしているところですが、それはのちに 3D のポリゴンモデルをつなげてアニメーション、になる予定です。
それができたら上図のようなものを表現しようと思っています。
以上、番外編でした。
ところで、Google 検索で、site:https://web6047.sakura.ne.jp/ とやると、検索結果が出ません。
ウェブページの SEO(検索エンジン最適化)対策について説明しているサイトによれば、この場合、検索エンジンにまったく登録されていなくて、何かしらのキーワードで検索しても、このウェブページが検索結果に載ることは一切無い、ということだそうです。
夜間の表示を止めているのでそうなっているんだと思いますが、だからと言って夜間の表示を再開すると、意味がないと思うので、
サーチエンジンに載ってないことのほうがよっぽど意味がない気がするんだけど…
|
じゃぁ、このサイトの訪問者の方々(たぶん0~2,3人程度)はどこから来た人たちなのか、というと?
それぐらいですかね、あはははは?
は?
ひとり~~~~、カラオケって、結構楽しめる人なんですよ、私。
大丈夫なのかなぁ、、。
4コマ漫画を かきました。字が汚いので、字幕付き。
ほ く と の 悔 い |
||||
字 幕 |
我が一生に…!! | 一片…二片…三片… | ラ、ラオウ お前がそんなに気さくなヤツだとは 思わなかったよ |
あ? 気さく?正直のまちがい じゃねーのか意味わかんねー |
線画ではなく、画像を使うようにしました。
まだ途中なので、頭が小さくなっちゃってます。
※画面をクリックすると、繰り返します。
JavaScript の CANVAS は、他の処理系と同じように、画面の左上が座標の原点 0, 0 になっていて、下へ行くほど y が増加します。
しかし、数学のグラフでは上へ行くほど y が増加するし、現実の世界でも高さを測るときは上へ行くほど高さ y は増えますよね。
キャラクターは地上(画面底辺)に足を置いていて、ジャンプしたりするし、身長を考えたりするときも y は下から上へ増えるほうが都合が良いです。
さらには、3DCG を描画するときも、上へ行くほど y が増加するという前提で描画されています。
その辺のことを考えて今まで canvas の y 座標を上へ行くほど増えるようにしていました。
canvasContext.scale( 1, -1 );
とすればそれが実現できます。画面の y 軸が逆転し、上へ行くほど y が増加するように変わります。
(原点は左上のままなので、左下にするには canvasContext.translate( 0, 画面の高さ ) とする)
ところが、その場合、線を引くのは問題ありませんが、画像を描画したり、文字を描画しようとすると上下がさかさまになってしまうという問題があります。
▼正しくは、こうなってほしい | ▼しかし画像(頭)は上下逆、文字も逆に描かれてしまう |
この解決をいろいろ考えたり、調べたりしましたが、結論としては「できない」ということになりました。
解決策はあるにはあるんですが、無駄な処理を付け加えなければならないので、処理速度が落ちたり、プログラムが複雑になったりするのが気になって、難しいです。
たとえば、画像を描画するたびに scale( 1, 1 ) を行ってから描画するようにし、描画したら scale( 1, -1 ) に戻すとか。
しかも、scale() だけではなく、画面の上下が逆転することで y 座標の値も調整しなくてはなりません。
その分処理が重くなりそうです。
海外でも同じようなことで話題になっていました。
(以下引用 翻訳は Google 翻訳)
質問者:
Canvasでグラフを描画していて、y軸が「後方」であるという事実に苦労しています。 原点は左上隅にあり、値の増加は上ではなく下になります。
translate()を使用して、原点を左下隅に移動できることを知っています。
そして、scale()を使用してy軸を反転できることを知っています。
テキストが上下逆に表示されることを除けば、これは機能しているようです。 Canvasの座標を期待どおりに機能させる方法はありますか?
回答1:
最新のセットアップでは、context.transform(1、0、0、-1、0、canvas.height)を使用できます。 これにより、y軸が反転し、キャンバス全体が1画面分移動します。
返答:
残念ながら、この方法でもテキストが反転しているようです。
回答2:
慣れればもっといいと思います。 原点は、ほとんどのピクセルベースのビデオ/画面APIの左上にあります。
(私による補足: ソフトウェアで対応するのではなく、「自分が適応すればいい」と言っているようです)
回答3:
graph_height-yをプロットします。
返答:
うーん。 私はこのアプローチを採用しましたが、しばらくすると、y座標を含むすべての呼び出しでこれを実行する必要があり、非常に面倒でエラーが発生しやすく、不必要に雑然とします。 私はむしろ<回答1>を使用したい。
(以上引用)
私は回答3の方法を取りました。質問者本人も採用したと言っていますよね。
つまり、画面の高さ - y とすれば、意図したものが描けます。
当たり前の方法であり、誰でもそう考えそうであり、それほど複雑でもない、というのが理由です。
ただ、プログラムの計算部分では y は上へ行くほど増えることを前提に計算し、描画部分で「画面の高さ - y」で対応するようにしました。
そうすれば、「y座標を含むすべての呼び出しでこれを実行する必要があり…」というのも緩和されます。
それに、draw() の中に面倒な部分を隠蔽しているみたいで、プログラムのやり方としてイケてる気がします。
それにしても、せっかく scale( 1, -1 ) で数学のグラフなどを意図的に描画できる道があるのに、文字や画像を描画しようとするとさかさまになるというのは、残念な状態ですよね。数学や研究などの用途でニーズはあると思うので、JavaScript の次回のリリースとかで対応しても良いんじゃないかと思います。
(訪問者のどんなニーズと この記事がつながるか)
前回計算した放物線の方程式(の係数 a, b, c を求める式)を使って高さ指定をできるようにしました。
バク転で飛ぶ高さと、距離をあらかじめ乱数で決めています。
伸身宙返りのほうは、古い方法での動作になっています。
※画面をクリックすると、繰り返します。
プログラムリスト中の、関数 getABCByPoints() の中にその「係数 a, b, c を計算」している部分があります。(リストの最後のほう 1353 行目)
その関数を呼んでいるのは、this.poses.bridge = new Pose... の中です。(リストの前のほう 281 行目)
これでイメージ通りのジャンプができるようになりました。
(訪問者のどんなニーズと この記事がつながるか)
特別なドラマではない。
その人の思い出なんか知る由もない。
でもさまざまな思い出が人を引き付けるのだ。
RPG に物語を盛り込むには…と考えていて、私のこれまでのいろいろな思い出を思い出していて、上のような3行を物語づくりの方針の1つとして書き出してみました。
物語の少ない、謎解きや戦闘を中心とした RPG(ドラクエ1等)の隠し味として、むやみに表に出さずに、これらをちりばめるように配置すれば、人を飽きさせない RPG にできるのでは…と思います。
私が望むような RPG の完成まで、先の道が見えず、遠く、どうなるのかなといったところです。でもそれも悪くないかな…。
ゴールを急ぐことはないかもしれない。
(訪問者のどんなニーズと この記事がつながるか)
私の勤め先で、私の仕事の内容がちょっと責任の重い仕事に変わることになりそう(まだ確定ではない)なので、私の日ごろのPC使用時間をもっと減らすことにします。パソコンのやりすぎは仕事に影響するので。
今まではこんな感じにしていましたが、
月 平日 PC使用 1.5hまで
火 平日 (PC使用しない)
水 平日 PC使用 1.5hまで
木 平日 (PC使用しない)
金 平日 PC使用 3hまで
土 休日 PC使用 4hまで
日 休日 PC使用 4hまで(そのうち最後の1hは3DCGモデリング(疲労が少ない))
これからは次のようにします。(まだ確定ではない)
月 平日 (PC使用しない)
火 平日 (PC使用しない)
水 平日 PC使用 1.0hまで
木 平日 (PC使用しない)
金 平日 PC使用 1.5hまで 3.0hまで(翌日は休日なのでこれまで通りで良い)
土 休日 PC使用 2hまで 4.0hまで(翌日は休日なのでこれまで通りで良い)
日 休日 PC使用 2hまで(そのうち最後の1hは3DCGモデリング(疲労が少ない))
PC使用しない時間は、ファンタジーや RPG の原点とも言える J.R.Rトールキンの小説「指輪物語」を読んで(紹介していませんでしたが実は購入して読み始めていました)RPG の基礎知識をたくわえたり、その他、まぁいろいろできると思います。
新しい仕事が軌道に乗るのかどうかはわからないので、本当に上のようになるかはわかりませんが…
(訪問者のどんなニーズと この記事がつながるか)
えっへっへっへっへ
これは やばいわ!
うわっ、やばいのはあんたでしょ!
|
毎月このウェブページではページの最初に JavaScript による何かしらのデモンスト―レーションを行っています。「オブジェ」だとか「扉スクリプト」なんて呼んでいたりもします。
この数か月は10月分のスクリプトがなかなか終わらなくて、時間がかかっています。
スクリプトの進捗に合わせて毎回「作成経過」を記事にして掲載しており、今回はその10回目です。
最終的に作成するのは「3DCG でキャラクターを動かす」というもので、今のところは 2D の状態でキャラクターを動かすプログラム(=スクリプト)を作っているところです。
その機能の1つとして、「キャラクターを放物線に沿ってジャンプさせる」というプログラムを作っています。
始点と終点を決めて放物線を描くところまではできていましたが、放物線の頂点を自在に指定することができないでいました。
数学の方程式を解く、という作業ですが、それがだいぶ複雑な計算になってしまい、自分にできるだろうかと不安になっていたところです。
それが今回できたので、うれしさのあまり記事の最初に「奇声」をあげてしまいました。
「始点と終点を決めて、その2点を通る放物線を描くプログラム 高さ指定 完成版」
このように意図したとおりにできています。良かった。
(数学の計算を代わりにやってくれる wolfram|alpha というサイトも試してみましたが、「計算過程の表示」は有料で参考にできませんでした)
丸一日かけて計算し、そのなかで2度3度やり直しも行いました。1回の計算が長い!
下図はそのボツ計算の様子を掲載しています。
こんなことやったんだ、程度にパラパラとご覧ください。
▼ボツにした計算用紙10枚(ダメだと思ってクシャクシャポイしたのでクシャクシャです)
この計算、「数学」の単元のどの計算かと言うと、「3元 2次 連立方程式」というものです。
中学生のころにやったのは「2元 2次 連立方程式」でした。
x, y の2つの変数だったので、変数の数を数えて「2元」。
x2 + y2 = 10 |
x2 + y2 + 2x + 4y - 12 = 0 |
x と y の 2 個だけ。
その計算方法は、片方の式について x について解いて、その結果をもう片方の式に代入して、y について解けば解がわかるというものでした。
|
|
なんて、答えを書いたりしていましたよね。忘れてました? 私は忘れていました。
そして、私が今やっているのは、a, b, c という3つの変数なので、「3元」。
式も3つになります。
sy = a sx2 + b sx + c |
ey = a ex2 + b ex + c |
cy = - a ( b / 2a )2 + c |
※sx, sy, ex, ey と cy はプログラムのほうで始点、終点、高さとして適当な数値を代入しています。
「3元」とはいえそんなに難しいものではなく、「2元」のときと同じく、1つの式を1つの変数について解いて その解を別の式に代入して…というのを 3 回くらい繰り返せば良いというだけです。
しかし解いていると、あれよあれよのまに どんどん複雑になっていく!
下の写真は計算が終了し、プログラムにしてみたらうまく動いたというものです。
▼最初、プログラムにしたら少しおかしくて、計算内容をチェックしたら一か所、+とーを間違えていたのを発見しました。修正したら正しく動きました。
数学の話をもうちょっと してしまうと、
解いていて式が複雑になったら、あの中学生の頃に見かけたあの公式、
ax2 + bx + c = 0
の形に近づければ良いんです。(良いんです、というか今回「そうすれば良いのか!」といろいろ考えてやっと気づきました)
上記タブのうちの「紙1★」の最後の式がそれです。(x, y ではなくa, b, c を求めたいので、私が書いた式は x2 ではなく a2 が入ったりしています)
その形になったら、ax2 + bx + c = 0 の a, b, c に当たる部分を2次方程式の解の公式、
y = | -b ± √( b2 - 4ac ) |
2a |
に代入すれば解がわかる……ということです。上記タブのうちの「紙2★」の式です。
前々回の同記事で「挫折した」と言っていたのは、方程式の「展開」とか「因数分解」とかの方法や、上記複雑になったときのまとめ方等を忘れていたからでした。
(展開は、(a - b)2 = a2 -2ab + b2 にする等です。因数分解はその逆です)
…それにしても、たかが放物線(2次方程式)で、「始点」と「終点」と、「それらに対する頂点のy座標の位置(ジャンプの高さ)」の3座標をあらかじめ決める、というだけで、こんなに大変になるものだろうか?
何はともあれ、今日はひと段落できました。
(訪問者のどんなニーズと この記事がつながるか)
前回、
サイトさんのこの方法「グラフが3点(0,6),(2,2),(6,18)を通る2次関数を求めなさい。」を使えばいいのだろうか…やってみよう。
と私自身が言っていたので、実際にやってみました。
すると、わりと目的の高さに近いようにできるようになりました。
「始点と終点を決めて、その2点を通る放物線を描くプログラム 高さ指定β版」
【キー操作】
でも微妙に違うので、もうちょっとがんばります…。できるかな?
…なんか毎月の扉スクリプトのために毎日を費やしている気がする…。
(訪問者のどんなニーズと この記事がつながるか)
今月の「web6047」のタイトル文字の色を水色にしたので、合わせて「3Dお姉さん」の髪の毛の色も水色にしようと思いました。
色を変えるだけではなく、ちょっとだけ形を いじっています。
で、タイトル文字の下に小さく置いただけでは迫力がないので、ここにちょっと大きく載せることにしました。
▼最初のバージョン
▼このページの最下部の背景用のバージョン
▼髪の毛をなびかせようと思って、手を加えたバージョン
あのう、
わたくしのほうの 出番というのは いかがなもので…? |
上の表「NO PC WEEK に代わる PC 使用制限のしくみ(β版)」の 行 No.259 にて「計算方法に悩んでいた」と書いたのは下記のプログラムのことです。
このプログラムは始点と終点を決めるだけで、その2点を放物線で結んでくれます。
キャラをジャンプして高い場所に移動させる場合など、着地点が決まっているときに便利だと思って、その試作プログラムとして作り始めました。
他のウェブページさん の数学の計算の説明を読ませてもらって、一応できているんですが、ジャンプの高さを自由に決めたいと思って、それがなかなかできないでいます。そのへんでだいぶ悩んで、保留になっています。
「始点と終点を決めて、その2点を通る放物線を描くプログラム」
【キー操作】
ここで、放物線の式の係数 a を増減させると、高さが任意に変えられるんですが、これを手動ではなく、計算による自動にしたいんです。(上に掲載したプログラムの赤い横線に放物線の頂点(急カーブ部分)を合わせたい)
それができれば、a を試行錯誤で決めずに、始点と終点と高さを決めるだけで、キャラを思った通りのイメージでジャンプさせることができると思うんです。
その計算を行う際に、与えられている情報は、
なお、y = ax2 + bx + c は形を変えて、y = a ( x - p )2 + q にできる。この p, q は放物線の頂点の x, y 座標である。
式に始点を入れた場合と、終点を入れた場合とで、連立方程式にするのかなと思ってやってみましたが、計算が複雑になり、まとまりません。
数学の証明問題のようなもの↓
与えられている情報:
このとき、放物線の式の a, b, c を求めたい。まずは a を求める。
放物線の式のままだと、変数が 3 つあるので式を変形する。(平方完成っていうのかな?)
y = ax2 + bx + c
変形して、
y = a ( x - p )2 + q
q は放物線の頂点の y 座標であり、それは指定しているので、
y = a ( x - p )2 + maxY ...[1]
x, y は始点や終点が入り、maxY は指定しているので、不明な a, p の2つを求めたい。
[1]式に始点、終点を代入する。
sy = a ( sx - p )2 + maxY ...[2]
ey = a ( ex - p )2 + maxY ...[3]
これを連立方程式として、a や p について解く。
… [2]式を p について解いたあと、その p を [3]式に代入して a について解けば、a がわかるはずですが、その過程が複雑になってしまい、挫折してしまいます。
なんか、数学の基本の何かを自分は忘れているのかな、と思う。
最初にリンクを貼ったサイトさんの説明でも『「p2」が出てきて計算が難しいので(変形しないで行う)』と言っていて、ここではその変形を行っているので、それで難しいのかもしれません。
サイトさんのこの方法「グラフが3点(0,6),(2,2),(6,18)を通る2次関数を求めなさい。」を使えばいいのだろうか…やってみよう。
(訪問者のどんなニーズと この記事がつながるか)
このサイトでは、毎月トップページの最初に「扉スクリプト」と銘打って、JavaScript によるオブジェを掲載しています。
今回はその作成経過の7回目です。
※画面をクリックすると、繰り返します。
アニメの内容は以前と同じですが、プログラムを整頓しました。
プログラムの動きについて断片的に説明すると、
ローカル座標とは、たとえば、あなたが日本のどこどこの位置にいる、という広い意味での座標があるのと同時に、あなたは部屋の中のどの位置にいる、というせまい意味での座標もあります。そのせまい意味での座標のことをローカル座標と言います。その部屋が「移動式」の不思議な部屋だったとして、部屋がどこかへ移動したとしても、部屋の中のあなたの位置は少しも変わりませんよね。ローカル座標の外をおおっている広い意味での座標がどのように変わろうとも、ローカル座標は影響を受けません。
このプログラムにもっと近い説明をすると、ひじを90度曲げた状態で、肩を動かすことはできますよね。このとき「ひじはローカル座標で90度であり、肩をいくら動かしても変わらない」と言えます。ひじをまっすぐ伸ばした状態で肩を動かしたいと思ったら、ひじのローカル座標を0度にすれば良いんです。
このプログラムでローカル座標を使っている箇所は、1つのパーツの中での関節の位置を指定するときにローカル座標を使っています。あと、上記ひじの説明の通り、親パーツに対する子パーツの位置、角度もローカル座標で指定しています。他にもあったっけ…?その2点がおもなところです。
以上の説明だけで使ってもらうことは難しいと思いますが、どんなことをやっているのか、おおまかにわかってもらうといいかなと思いました。
ついでに絵についても少しお話をします。
上のアニメーションを見て、人間に見えたでしょうか?
上のアニメーションで使っている図は長方形だけです。複数の長方形を人間らしくつなげるだけで人間に見えるとしたら、人間の絵を描くときに必要なのは、「長方形を人間らしくつなげるだけ」ということになります。
▼長方形
むずかしいのは、その長方形1つ1つの大きさや長さをどれくらいにするのか、うまく目分量を取ることです。
あなたのひじをおなかに寄せると、「うでのひじまでの長さは、へそくらいまで」とわかります。体育すわり をしたとき、太ももとすねをヒザで折って太ももとすねが同じ長さになるという事実から「ふとももとすねはだいたい同じくらいの長さだ」とわかります。腕も同じです。そんな感じで目分量を取ればお手軽に人間が描けるのではと思います。
(ただし、これは横から見た図の場合に使えるテクニックです。正面を向いて腕を前に出すという立体的なものを描くときはこの方法はちょっと使えません)
慣れてくると、さまざまなポーズを手軽に描けるようになって、楽しくなると思います。
※上図の右の画像は正面ですが、腕を前に出していない(おくゆきがついていない)ので2次元的に描くことができます。
それでも描けない!「観察力の鍛錬」と「めんどくさい」のはざま
でも長方形の大きさや長さや、長方形同士の位置関係を、うまいぐあいに並べることができない、ということには なると思います。
クリエイターの人たちって、一度描いたものを「微妙に短くする」とか「微妙に大きくする」とかそういう微調整を日常的に行っていると思います。
鏡の前で、青の服を ハンガーを付けたまま体に当ててみて「違う」と思って、今度は灰色の服を持ってきて当ててみて「これも違う」、そして黒の服を当てて「これだ!」と思う。そうやって決めた服装というのは、結構出来上がっていて「決まっている」、「決めたぜ」、「キメ!」(?)という感じになっていると思います。それに対して、頭の中にイメージが漠然とあって、これでいいや、で適当に決めた服装というのは、残念な結果になると思うんですがどうでしょうか。
そういう選びぬくことをコーディネートと言ったり、微調整と言ったりします(コーディネートはちょっと違うかもですが)。絵が上手な人というのはそういう調整を何度も繰り返して、一番良いものを人前に出していると思います。それをやらなければ、絵が上手なはずの人もへたくそな絵を人前に出すことになると思います。
絵が上手な人と下手な人は、同じところから出発するけど、「調整の回数の違い」で、差が出るのではないでしょうか。
「ブラッシュアップ」の有無とも言えるかな?「こだわり」、「もっと ふみこんで」とも言えそう。
私はイラストについてはアマチュア未満なところもあるので、このことについてプロの人の言葉を引用させてもらうと、
「そういった学生たちにはいったい何が欠けているのか、毎年大人数の学生に教えているので、私はある種のパターンをつかむことができました。一つのキーワードとしてまとめると、それは「見る力の弱さ」なのです」(MAYAモデリング造形力矯正バイブル第2版 田島キヨミ著 P181下部)
「目、鼻、口のパーツが作り終わっても「なんかおかしい」とずっと試行錯誤してしまう人が多くいます。フォルムのバランスをとれない人の多くが、パーツを作り込む前の基礎フォルムをおろそかにしているのです。顔を作る=目鼻口を作るという思い込みが、頭部(頭蓋、首、あご)のバランスをとることの重要性を無視してしまうのです」(同著 P182上部)
「後輩や新人を指導する際に感じることで、画力が思うように上がらない人、または向上心のない人に共通する理由として、「観察力の欠如」が挙げられます。漫画を練習するときに漫画でしか勉強してこなかった、あるいはそれが当たり前だと思い込んでいるのが原因なのかもしれません」(人体解剖図から学ぶキャラクターデッサンの描き方 岩崎こたろう/カネダ工房著 P190あとがき)
みなさん同じことを言っています。「思い込みで描かずに、実物をよく見て」
▼白虎を描こうとして、試しに虎についての 現状の力を出してみた(思い込み100%) |
▼虎の写真を見ながら描いた(正解はこれ) |
左はネコだけど、上は白虎で通用する (うまくはないけど) |
引用を並べてまとめサイトみたいになってしまったので、まとめサイトでやっていないこと、逆に「そんなことない」みたいな逆のことを言っている記述を探してちょっと引用してみます。
「漫画やイラストの絵を描く場合、特に決まった描き方やルールがあるわけではありません。自分のイメージのまま自由に描くものだと思います。」「この本で紹介したのは、先人たちが積み上げた人体作画の知識の一部です。参考にするもよし、知識としておさえるもよし、いずれにしても作画の世界を探検する伴にしていただければ、うれしい限りです」(人体解剖図から学ぶキャラクターデッサンの描き方 岩崎こたろう/カネダ工房著 P189あとがき)
「絵に求められるのは説得力です。したがって、本来は、これが正しい描き方だ、というような「正解」はありません」
(私による補足: 結果(説得力)が必要なのであって、そのための過程(描き方)は決まっていません、と言っているのだと思います)
「しかし、絵に説得力を持たせるためには「正解」を知る必要があり、その正解を知る手段が、実際の写真を参考にするという手段だと思います」
(私による補足: 絵の描き方についての正解はないけど、説得力のためには写真という正解(実物)を参考にするのが良い、と言っているのだと思います)
「それから先は、皆さん自身がそれぞれの「正解=納得のいく線」を探してみてください」(マンガキャラ 服のしわの描き方 伊藤サトシ著)
つまり、 事物を忠実には描かない("象徴派"、"表現主義"の)作風であれば実物に沿う必要(写実的に描く必要)はないけど、実物を描写しているはずのマンガ・イラストを描こうとしていて説得力を持たせたい(上手に描きたい)なら実物を見ましょう、ということですかね…。
最初「事物を忠実には描かない("象徴派"、"表現主義"の)作風」について、私は「印象派」という言葉を漠然と使ったんですけど、印象派ってなんだ?と思っていろいろ調べていて、適切な言葉として「印象派」ではなく「事物を忠実には描かない("象徴派"、"表現主義"の)作風」という言い方に替えました。
"象徴派"、"表現主義" と、ダブルクオートで囲ったのは、私がそれらについて詳しいわけではなく、私が言おうとしていることについて、訪問者の方が調べるとしたらこの言葉を調べてくださいという意味で囲いました。
▼肩の骨を調べていて、よくわからなかったので、100円ショップで買った粘土を使って立体化しました。これをやって何か特別なものを得た実感はなかったんですが、やって良かったと思います。芸術のためには細部まで知っていたほうが良いという動機で創作の現場でよく行われていることだと思います。
▼腕の筋肉を勉強した後、何気なく腕を描いたら、それっぽく描けました。(右下)
このさりげない筋肉のふくらみが、キャラクターの魅力を助長するのだと思います。
昨今、萌え萌えとか美しい女性を描くことが流行っていますが、女性ばかりでない、男の魅力もこの筋肉で表現できるかもしれませんね。
Wikipediaの「象徴主義 - 定義」で、こんな「芸術の定義」が掲載されていました。
芸術作品は
第1に観念的であるべきである。そのただ1つの理想は観念の表現であるから。
第2に象徴的であるべきである。その観念に形を与えて表現するのだから。
第3に総合的であるべきである。諸々の形態や記号を総体的に理解される形で描くのであるから。
第4に主観的であるべきである。事物は事物としてではなく主体によって感受される記号として考えられるのであるから。
第5に装飾的であるべきである。
「こうあるべき」というものについて拒否反応を示す方もいるとは思いますが、これは、油絵のゴッホとゴーギャンという画家の知名度向上に貢献した美術評論家の人が、ある文芸誌上で定義したものだそうで、それなりの立場の方が示したものなので受け入れやすいと思います。
これら5つについて考えてみると、なんとなく絵を描くことについて頭の中が整理される気がします。
第3については、「自分が描こうとするものが "総体的に理解される形" であることが必要」と言っていると思いますが、これは、意味を成さない正体不明のものを描いても、それは鑑賞されにくい、と言っているのかなと思います。
第5については、「自分が描いたものが、人が見て『良いな』、または自分が見て個人的に気に入るものであることが必要」と言っているんだと思います。
第1と第2についても、「自分の中に観念(イメージ)があって、それに "形を与えて表現する" ものだ」というのも、創作活動についてどこか科学的に説明していて、自分の考えが整理される気がします。(「観念的」とか「象徴的」とか言葉の意味はよくわかりませんが)
第4については、その事物をあなたはどう描くのか、みんながそろってぴったり同じものを描いたら面白くないと言っているんじゃないかなぁ…と思います。右にならえで描いてもつまんないから、あなたの絵を見つけてください、かな?
第1から第5まで、それぞれに必要なのは、やっぱり、自分のイメージを形にする作業についての慣れ(画力の上達)かなと思います。そして、画力の上達のためには「見る力、観察力」は欠かせないし、理解される形にするには、思い込みは排除したほうが良い…かな。物語も自分が体験していないものを「あてずっぽう」や「考えて」描くよりは、体験したことを描くほうがリアルに描くことができ 理解されやすいと思います。
▼物の構造を知る。難しい「流し目」も、目玉を薄く描いて、まぶたがどう重なっているかを考えて描くと急に描けたりするかもしれません。しかし顔にこれを取り付けて自然な顔になるかどうかはまた別の話だと思います。そのためには頭蓋骨を知る必要があり、目玉がどんなふうに頭蓋骨の目の部分の穴に収まっているか知る必要がありますね…、と言っても面倒に聞こえると思うので、その辺は考えずに、下図のような方法でいきなり顔に当ててみるのも楽しいかもしれません。
▼私は難しいアングルを、いつか2,3ヶ月くらいのあいだ仕事の休み時間に何度も下図とまったく同じ図をドリルしました(通算10回~20回くらい)。面倒くさくなってやめて1か月ブランクをあけて、描けるかな?と思って描いたのが下図です。けっこう描けてますね。やっぱり "小学校の通学路を6年かけて身に付け、もう忘れない" という話と同じみたいです。(いつか絵を描く方法としてそんな話をしていました)
▼勉強前 首筋から肩にかけてが、唐突にくっついている |
▼勉強 人体解剖図などで、そこにある筋肉を調べる |
▼勉強後 首筋から肩にかけて、自然になった |
ばんざーい。 女性なのに男性みたいな体格だけど |
私は中学生の頃に器械体操部にいて、先輩たちの上手な技をたくさん見たり、元 国体選手の先生から「もっとこうすると良い」というのを聞いていました。
それはたとえば、「バク転で床に手をついたとき、肩で床を押すんだ」、「バク転の終わりに床を蹴って宙返りに入るとき、腰を引き上げるんだ」などなど。そんな先生の言葉を反映するようにアニメを作ったんです。
また、体操選手というのは、着地が決まると独特の「間」を持たせることが多いです。「決まったぜ」という実感をかみしめているんでしょうか。そのため技の終了時にちょっと時間を置くようにしました。
そして体操とは関係ありませんが、技の終了で両手を挙げたときの姿勢は「人体のS字カーブ」(リンクはBingでキーワード検索)を気にしました。
それで説得力のある鑑賞にたえる「バク転 伸身宙返り」になっていると思います。(私は、見た・聞いたことを覚えているだけで、私の体操競技の実技は「バク転らしきものをできたかもしれない」といったところでした)
やはり、その物の形や動きを知っているかどうかが、絵を描けるかどうかの大きなポイントの1つのようです。
でもこれを読んでいる人は、「いますぐ描きたい」んですよね。
そのために観察力を持って…というのは面倒ってことですよね。
「漫画やイラストを描こうと思い立って、まず筋肉や骨格から絵を描き出そうとする人なんていないでしょう。趣味で、あるいはプロを目指す人が最初に描くのは好きなマンガキャラの模写がほとんどで、人体デッサンから入る人なんてそうそういないのではないかと思います」(人体解剖図から学ぶキャラクターデッサンの描き方 岩崎こたろう/カネダ工房著 P190あとがき)
「気軽に始めるためには、好きな女優などの(正面だけを選ばず様々な角度の)写真を描いてみてください。学生さんの場合、大量に貯まったスケッチをコラージュしてポートフォリオに入れれば努力が伝わりますよ」(MAYAモデリング造形力矯正バイブル第2版 田島キヨミ著 P189左上部)
好きなマンガキャラの模写、好きな女優など…つまり自分の気持ちや心のエンジンから入れ!と言っていますね。
好きなもの用意しました、絵を描くための教本も用意しました、でも描けない!描いてもへたくそだ!
いそがなくても良いんですよ。そんなに好きならきっといつか花開きますよ。
だれかの漫画家の個展に行って、いいなぁ、おれもわたしも描きたいんだよ…って思うだけでも良いと思います。
描こうとする対象をどんなに「見る力」をもって正確にとらえても、描き出す段階で「ゆがむ」とか「形を成さない」という問題が別途あると思います。
それについては今ここで書くことはできませんが、その辺はテクニックとかノウハウの話になるのかなと思います。たとえば、「ガイドライン」を引く(リンクは Bing 画像検索)とか。
▼自分なりの楽な方法を見つける
絵を描くには:
※描きたくないときは無理に描かない。1か月くらい描かなくてもよい。
※練習中にいかに「たのしい」と思えるかが大切で、これがないと、3日坊主になってしまう。だから「好きなもの」を描いたほうが良いし、短い時間の中でいかに上達するか(上達はたのしいから)も大切です。上達しないまま進めてもつまらないでしょう。上手に上達してください。そしてほめてくれる人が近くにいるとベストでそれも楽しいのうちです。
…、とここまでいろいろ伝えてみても、それでも描けないこともあると思います。私がある程度、アマチュア未満程度に描いて楽しめているのは、たまたまですから。子供の頃、たまたまその道が開いていて、気づいたらその道を進んでいた。一度進むと、いろいろ勉強することでさらに快適に動けるようになる。このたまたまその道が開いていた、というのが難しいところだと思うんです。私がたまたま努力もしないで(努力はしたけど、その努力の実行は困難ではなく)その道に入ったというのに、どうしてたまたまその道に入らなかった人々にその方法を教えることができるんだろう。という思いに負けそうになりますが。
→→→
小学生の頃、「みんなの夏休み」というタイトルでポスターを描いて、それで学校に提出しようとしていたとき、タイトルは上図の左端の状態でしたが、母が上図のような立体化の方法を「ほらっほらっ」と教えてくれて、それを見たとき、あふれんばかりの喜びに いてもたってもいられなくなったんですが、教えるんだったらそういう教え方が良いのかもしれないですね。
最後に私が白虎を描こうとしたときの失敗作を掲載しておきます。
失敗作を見せるというのは恥ずかしいことですが、それをあえて見せるのは、失敗を見せられない場というのは表現する場としては委縮につながると思うからです。誰でも自由に表現できる場というのはたぶんそれが前提にあると思います。失敗作ばっかり出していたのに、上達している、となればその場の意味は大きいですよね。
▼虎の写真を見ながら描いたんですが、その写真の虎、カメラ目線でメッチャ頭に来て「この野郎」って感じの表情をしていました。
あ、いけね、10月のスクリプト作っていて12月に入ってしまった…。
(訪問者のどんなニーズと この記事がつながるか)
<!DOCTYPE html><!--ESCAPEPROCESS-->
<head>
<script>
function onloadx() {
//一般関数
console.log( "文字列" );
}
function Class1() {
//クラス
console.log( "文字列" );
}
Class1.prototype.method1 = function() {
//メソッド
console.log( "文字列" );
}
</script>
</head>
<body onload="onloadx();" style="">
Hello world!<BR>
</body>
</html>
<!DOCTYPE html><!--ESCAPEPROCESS-->
<head>
<script>
function onloadx() {
//一般関数
console.log( "文字列" );
}
function Class1() {
//クラス
console.log( "文字列" );
}
Class1.prototype.method1 = function() {
//メソッド
console.log( "文字列" );
}
</script>
</head>
<body onload="onloadx();" style="">
Hello world!<BR>
</body>
</html>
<!DOCTYPE html><!--ESCAPEPROCESS-->
<head>
<script>
function onloadx() {
//一般関数 コメント変更
console.log( "文字列変更" );
行追加
}
function Class1() {
//クラス コメント変更
console.log( "文字列変更" );
行追加
}
Class1.prototype.method1 = function() {
//メソッド コメント変更
console.log( "文字列変更" );
行追加
}
</script>
</head>
<body onload="onloadx();文字列変更" style="">
Hello world!<BR>
HTML追加
</body>
</html>
<!DOCTYPE html><!--ESCAPEPROCESS-->
<head>
<script>
function onloadx() {
//一般関数 コメント変更
console.log( "文字列変更" );
行追加
}
function Class1() {
//クラス コメント変更
console.log( "文字列変更" );
行追加
}
Class1.prototype.method1 = function() {
//メソッド コメント変更
console.log( "文字列変更" );
行追加
}
</script>
</head>
<body onload="onloadx();文字列変更" style="">
Hello world!<BR>
HTML追加
</body>
</html>